]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st/widget: Fix applying :insensitive to initially unreactive widgets
authorFlorian Müllner <fmuellner@gnome.org>
Sun, 7 Feb 2021 22:21:55 +0000 (23:21 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Sun, 7 Feb 2021 22:48:32 +0000 (23:48 +0100)
We are applying the :insensitive pseudo class to unreactive widgets,
or at least we are supposed to. As we currently only update the style
on notify, we don't apply it to initially unreactive widgets.

This was covered up partially until recently when Clutter started to
use G_PARAM_EXPLICIT_NOTIFY. Before that, the notify handler would run
when explicitly setting :reactive to FALSE at construction time.

Make sure we always apply the pseudo class correctly by updating it
after construct properties have been set.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3685

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1648>

src/st/st-widget.c
src/st/test-theme.c

index 2ee74af0811a88d76dec720fb1eeff267ca0a64b..7e03028c0d2b367a567bb0989acc329d8fbf509b 100644 (file)
@@ -142,6 +142,15 @@ static gboolean st_widget_real_navigate_focus (StWidget         *widget,
 static AtkObject * st_widget_get_accessible (ClutterActor *actor);
 static gboolean    st_widget_has_accessible (ClutterActor *actor);
 
+static void
+st_widget_update_insensitive (StWidget *widget)
+{
+  if (clutter_actor_get_reactive (CLUTTER_ACTOR (widget)))
+    st_widget_remove_style_pseudo_class (widget, "insensitive");
+  else
+    st_widget_add_style_pseudo_class (widget, "insensitive");
+}
+
 static void
 st_widget_set_property (GObject      *gobject,
                         guint         prop_id,
@@ -247,6 +256,14 @@ st_widget_get_property (GObject    *gobject,
     }
 }
 
+static void
+st_widget_constructed (GObject *gobject)
+{
+  G_OBJECT_CLASS (st_widget_parent_class)->constructed (gobject);
+
+  st_widget_update_insensitive (ST_WIDGET (gobject));
+}
+
 static void
 st_widget_remove_transition (StWidget *widget)
 {
@@ -840,6 +857,7 @@ st_widget_class_init (StWidgetClass *klass)
 
   gobject_class->set_property = st_widget_set_property;
   gobject_class->get_property = st_widget_get_property;
+  gobject_class->constructed = st_widget_constructed;
   gobject_class->dispose = st_widget_dispose;
   gobject_class->finalize = st_widget_finalize;
 
@@ -1471,10 +1489,7 @@ st_widget_reactive_notify (StWidget   *widget,
 {
   StWidgetPrivate *priv = st_widget_get_instance_private (widget);
 
-  if (clutter_actor_get_reactive (CLUTTER_ACTOR (widget)))
-    st_widget_remove_style_pseudo_class (widget, "insensitive");
-  else
-    st_widget_add_style_pseudo_class (widget, "insensitive");
+  st_widget_update_insensitive (widget);
 
   if (priv->track_hover)
     st_widget_sync_hover(widget);
index d38b41f03ea81c583735706e00cd06e4ba37dc1f..6aff82b0dd4c3ad9c0c507b26af4174b60ce769e 100644 (file)
@@ -465,6 +465,8 @@ test_pseudo_class (void)
 
   /* Test the StWidget add/remove pseudo_class interfaces */
   label = st_label_new ("foo");
+  /* Make reactive, so we don't get the automatic :insensitive style */
+  clutter_actor_set_reactive (CLUTTER_ACTOR (label), TRUE);
   clutter_actor_add_child (stage, CLUTTER_ACTOR (label));
 
   labelNode = st_widget_get_theme_node (label);